home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / amos / am_mui10.lha / MUI / Hook.s < prev    next >
Text File  |  1992-02-26  |  7KB  |  263 lines

  1. *****************************************************************************
  2. *    AMOS-MUI Hook stub code  for assembler hooks & AMOS Procedure hooks    *
  3. *                                                                           *
  4. * This file is assemled to bank 14, and contains the code for hook which    *
  5. * call AMOS Procedures, and the initialisation & Finalisation code for      *
  6. * hooks which are implemented as assembler procedures.                      *
  7. *****************************************************************************
  8.  
  9. * NOTE: Set tab size to 16 to read properly.
  10.  
  11. * When your assember hook code is called:
  12. *
  13. * - Registers D2-D7/A2-A6 have been saved, and will be restored.
  14. *
  15. * - Registers A0/A1/D1 may be trashed safely
  16. *
  17. * - Register D0 is used to return values to MUI. Remember TRUE is 1, not -1
  18. *
  19. * - Register A0 contains a pointer to the start of your hook code.
  20. *
  21. * - Registers A1 & A2 are as defined in the MUI tag autodoc which calls
  22. *   your hook function. (Varies depending on why hook is called)
  23. *
  24. * - Register A3 contains a pointer to the global data area for all hooks.
  25. *   Currently:
  26. *
  27. *   -4(A3) = Intuition Base   (Also in A6)
  28. *   -8(A3) = AMOS Data Zone Address   (Also in A5)
  29. *     (A3) = MUI Master Library Base
  30. *    4(A3) = Used by AMOS Procedure hooks - leave alone
  31. *    8(A3) = Used by AMOS Procedure hooks - leave alone
  32. *
  33. *   Other offsets may be defined in the future.
  34. *
  35. *
  36. *    
  37. * - Register A4 contains a pointer to the data area you passed to the
  38. *   _MUI_ASM_HOOK[ADR,D] procedure in the D parameter.
  39. *
  40. * - Register A5 contains the usual pointer to the AMOS Data zone.
  41. *
  42. * - Register A6 is preloaded with the base of the intuition library, for
  43. *   easy calling of GetAttr/SetAttrsA. There is no point in opening/closing
  44. *   intuition from the hook, as both AMOS & MUI always have it open anyway.
  45. *   DosBase,GfxBase,DiskFontBase,LayersBase can all be obtained from A5
  46. *   etc. Move.l DosBase(a5),a6, if you include the |AMOSPro_Includes.s from
  47. *   the extensions directory of AMOSPro_Tutorial.
  48. *
  49. * - Obviously the stack pointer (a7) must be left as it was found when your
  50. *   hook function quits.
  51.  
  52.  
  53. * Since you code is loaded into AMOS, this means you cannot call domethod
  54. * in amiga.lib since it would be in a second hunk. The following code
  55. * is equivilent to domethod without error check (And is much faster :-)
  56. *
  57. * Initially, the object pointer must be in A2, and the taglist pointer in
  58. * A1. It is important the A0,A1,A2,A3 all have these values.
  59.  
  60. ;    move.l    -4(a2),a0
  61. ;    move.l    8(a0),a3
  62. ;    jsr    (a3)
  63.  
  64. * Believe it or not, that's it (This was adapted from a bit of E code by
  65. * Wouter van Oortmerssen).
  66.  
  67. * For those with out of data includes, include these 4 lines for inuition
  68. * library calls to objects using taglists.
  69. *
  70. ; _LVOSetAttrsA EQU -648   ;(A0 = Object, A1 = Taglist)
  71. ; _LVOGetAttr   EQU -654   ;(D0 = Attribute Tag Value, A0 = Object,
  72. ;                          ; A1 = Address To Store Result)
  73. ;  TAG_DONE     EQU 0      ;To mark the end of some taglists (But not those
  74. ;               ;in SetAttrsA, or DoMethod.
  75.  
  76.  
  77.  
  78.  
  79. ***************************************************************************** 
  80. * Source for Bank 14
  81. *
  82.  
  83.     Incdir    cde:prog/devpac/include/include/
  84.     
  85.     Include    libraries/mui.i
  86.     Include    exec/exec_lib.i
  87.  
  88.  
  89.  
  90. * Structure of hook data area for hooks which are AMOS procedures.
  91. * AMHD_User is a pointer to the users data area for the hook.
  92.  
  93.  
  94.  
  95. AMHD_Next    equ    0
  96. AMHD_ID    equ    4
  97. AMHD_A1    equ    8
  98. AMHD_A2    equ    12
  99. AMHD_D0    equ    16
  100. AMHD_Task    equ    20
  101. AMHD_Signal    equ    24
  102. AMHD_User    equ    28
  103.     
  104.  
  105.  
  106. ******************************
  107. * 4-Byte Jump Table
  108.  
  109.     bra    hook_prepcode    ;Called By Assembler hooks to initialise
  110.     bra    hook_callamos    ;Called By AMOS hooks to wait
  111.     bra    hook_getfirst   ;Called By AMOS hook processor to get first hook to execute
  112.     bra    hook_getnext    ;Called By AMOS hook processor when it has finished excuting a hook
  113.             ;to release the task that called the hook, and get the next to execute
  114. ******************************
  115. * Global Hook Datazone    
  116.  
  117. * The first three entires are initialised by the _MUI_INIT procedure
  118.  
  119. hook_prepdata    dc.l    0    ;AMOS A5 goes here
  120.     dc.l    0    ;Intuiton Base goes here
  121.     dc.l    0    ;MUI Base goes here    
  122.  
  123.  
  124.  
  125. hook_AMOSGlob    dc.l    0    ;1st Waiting Hook Chain
  126.     dc.l    0    ;Last Waiting Hook
  127.  
  128.  
  129. ******************************
  130. * Initialisation and
  131. * Finalisation Code for
  132. * assembler hooks.
  133.  
  134. hook_prepcode
  135.     movem.l    d2-d7/a2-a6,-(sp)     ;Store registers
  136.     move.l    16(a0),a4             ;Get hook data area
  137.     lea    hook_prepdata(pc),a3  ;Get global data area
  138.     movem.l    (a3)+,a5/a6           ;Setup A5/A6 values
  139.     move.l    12(a0),a0             ;Get hook code address
  140.     jsr    (a0)                  ;Execute hook code
  141.     movem.l    (sp)+,d2-d7/a2-a6     ;Restore registers
  142.     rts              ;Back to MUI
  143.  
  144.  
  145.  
  146. ******************************
  147. * Hook routine for all AMOS
  148. * procedure hooks
  149. *
  150.  
  151. * NOTE: This must be re-enterant code
  152.  
  153. hook_callamos
  154.     movem.l    d2-d7/a2-a6,-(sp)
  155.     lea    hook_AMOSGlob(pc),a3
  156.     move.l    16(a0),a4    ;Get hook data
  157.     move.l    a1,AMHD_A1(a4)  ;Store registers
  158.     move.l    a2,AMHD_A2(a4)
  159.     move.l    #0,AMHD_Next(a4) ; Becomes last in list
  160.  
  161.     ;Now try to allocate any signal bit
  162.  
  163.  
  164.     moveQ    #-1,d0
  165.     movem.l    a3-4,-(sp)
  166.     CALLEXEC    AllocSignal
  167.     movem.l    (sp)+,a3-4
  168.     move.l    d0,AMHD_Signal(a4) ; Store signal bit no.
  169.     bne.s    .gotsignal
  170.  
  171.     ;If no signal bit could be allocated, make hook return
  172.     ;immediately with false in D0. This will usually signal
  173.     ;MUI to cancel whatever it was doing...
  174.     
  175.     moveQ    #0,d0
  176.     rts
  177.     
  178. .gotsignal    ;Now we have a signal bit, store the task calling the
  179.     ;hook in the hook data_structure...
  180.  
  181.  
  182.     movem.l    a3-4,-(sp)
  183.     move.l    #0,a1    ;Task to find is itself
  184.     CALLEXEC    FindTask
  185.     movem.l    (sp)+,a3-4
  186.     move.l    d0,AMHD_Task(a4);    
  187.  
  188.     ;Now insert the current hook into the list of hooks for
  189.     ;AMOS to process.
  190.  
  191.  
  192.     CALLEXEC    Forbid    ;Don't corrupt list
  193.     move.l    (a3),d1
  194.     bne.s    .notfirst
  195.     move.l    a4,(a3)
  196.     move.l    a4,4(a3)
  197.     bra.s    .skip
  198. .notfirst    move.l    4(a3),a5
  199.     move.l    a4,(a5)    ;Set next pointer of waiting
  200.     move.l    a4,4(a3)
  201.  
  202.  
  203.     CALLEXEC    Permit
  204.  
  205.     ;This hook is now in the waiting list, so wait on the 
  206.     ;signal bit allocated earlier. AMOS will then signal us
  207.     ;when the hook procedure has been run.
  208.     
  209.     move.l    AMHD_Signal(a4),d0 ;Get Signal bit
  210.     move.l    a4,-(sp)
  211. .skip    CALLEXEC    Wait    ;Wait for signal bit
  212.     move.l    (sp),a4
  213.     move.l    AMHD_Signal(a4),d0 ;Get Signal bit Again
  214.     CALLEXEC    FreeSignal
  215.     
  216.     move.l    (sp)+,a4
  217.     move.l    AMHD_D0(a4),d0 ;Get return value from AMOS
  218.     rts                   ;and return it to MUI
  219.         
  220.  
  221.         
  222.             
  223.  
  224. ****************************************************************************    
  225. *
  226. * These routines is called by AMOS to execute hooks that are AMOS procedures
  227. *
  228. *
  229.  
  230.  
  231. hook_getnext
  232.     movem.l    a4-6,-(sp)    ;Store AMOS Regs
  233.     
  234.     lea    hook_AMOSGlob(pc),a3
  235.  
  236.     ;First remove the current hook from the list of waiting
  237.     ;hooks.
  238.  
  239.     
  240.     CALLEXEC    Forbid    ;No task switching
  241.     move.l    (a3),a4        ;Get head of hook list
  242.     move.l    (a4),d7    ;Get next in list
  243.     move.l    d7,(a3)    ;Update list pointer
  244.     CALLEXEC    Permit
  245.  
  246.     ;Now signal the task that called the current hook that it
  247.     ;may continue.
  248.  
  249.     move.l    AMHD_Signal(a4),d0    ;Get signal bit    
  250.     move.l    AMHD_Task(a4),a1    ;Get signal task
  251.     
  252.     CALLEXEC    Signal
  253.  
  254.     movem.l    (sp)+,a4-6    ;Restore AMOS Regs.
  255.  
  256.     ;Now hook_getnext runs straight into hook_getfirst...
  257.  
  258. hook_getfirst
  259.     
  260.     lea    hook_AMOSGlob(pc),a3
  261.     move.l    4(a3),d0
  262. .another    rts        
  263.